package dao.LibraryDao;

import dao.BaseDao;
import common.model.Entity.libraryEntity.Reserve;
import common.model.Entity.libraryEntity.enums.ReserveStatus;

import java.sql.Connection;
import java.util.List;
import java.util.Optional;

/**
 * 预约记录数据访问接口。
 *
 * <p>负责 {@code t_reserve} 表的增删改查及与业务相关的查询。</p>
 */
public interface ReserveDao extends BaseDao<Reserve, Long> {

    /**
     * 根据用户 ID 查询其所有预约记录。
     *
     * @param userId 用户主键
     * @return 预约记录列表，若不存在则返回 {@link Optional#empty()}
     */
    Optional<List<Reserve>> findByUserId(Long userId);

    /**
     * 根据图书 ISBN 查询所有相关预约记录。
     *
     * @param isbn 图书 ISBN
     * @return 预约记录列表，若不存在则返回 {@link Optional#empty()}
     */
    Optional<List<Reserve>> findByBookIsbn(String isbn);

    /**
     * 根据用户 ID 与预约状态查询记录。
     *
     * @param userId 用户主键
     * @param status 预约状态枚举
     * @return 符合条件的预约记录列表，若不存在则返回 {@link Optional#empty()}
     */
    Optional<List<Reserve>> findByUserIdAndStatus(Long userId, ReserveStatus status);

    /**
     * 根据图书 ISBN 与预约状态查询记录，并按预约时间升序排序。
     *
     * <p>常用于“通知取书”场景，优先通知最早预约的用户。</p>
     *
     * @param isbn   图书 ISBN
     * @param status 预约状态枚举
     * @return 排序后的预约记录列表，若不存在则返回 {@link Optional#empty()}
     */
    Optional<List<Reserve>> findByBookIdAndStatusOrderByTime(String isbn, ReserveStatus status);
}